#include <iostream>
#include <system_error>
#include "TaskQueue.h"
#include <mutex>
#include <stdlib.h>

using std::cout;
using std::endl;
using std::unique_lock;

TaskQueue::TaskQueue(size_t capa)
    :_capacity(capa)
    ,_que()
    ,_mtx()
     ,_notEmpty()
     ,_notFull(){

     }
TaskQueue::~TaskQueue(){

}
void TaskQueue::push(int value){
    srand(time(nullptr));
    //加锁
    unique_lock<mutex> ul(_mtx);
    //判满
    while(full()){
        _notFull.wait(ul);
    }
    //放入数据
    _que.push(value);
    //解锁
    ul.unlock();
    //唤醒其他
    _notEmpty.notify_one();
}

int TaskQueue::pop(){
    unique_lock<mutex> ul(_mtx);
    //判空
    while(empty()){
        _notEmpty.wait(ul);
    }
    //取出数据
    int num = _que.front();
    _que.pop();
    //解锁
    ul.unlock();
    //唤醒其他
    _notFull.notify_one();

    return num;

}
bool TaskQueue::empty(){
    return 0==_que.size();
}
bool TaskQueue::full(){
    return _que.size() >= _capacity;
}



